package gov.nasa.jpl.mbee.mdk.docgen;
import com.nomagic.magicdraw.core.Application;
import com.nomagic.magicdraw.uml.BaseElement;
import com.nomagic.uml2.ext.magicdraw.classes.mdkernel.Diagram;
import com.nomagic.uml2.ext.magicdraw.classes.mdkernel.Element;
import gov.nasa.jpl.mbee.mdk.api.incubating.convert.Converters;
import gov.nasa.jpl.mbee.mdk.docgen.docbook.*;
import gov.nasa.jpl.mbee.mdk.docgen.table.EditableTable;
import gov.nasa.jpl.mbee.mdk.docgen.table.PropertyEnum;
import gov.nasa.jpl.mbee.mdk.docgen.view.*;
import gov.nasa.jpl.mbee.mdk.docgen.view.util.DocGenViewSwitch;
import gov.nasa.jpl.mbee.mdk.util.Utils;
import java.util.ArrayList;
public class DocGenViewDBSwitch extends DocGenViewSwitch<DocumentElement> {
private boolean forViewEditor;
public DocGenViewDBSwitch(boolean vieweditor) {
super();
forViewEditor = vieweditor;
}
public DocGenViewDBSwitch() {
super();
forViewEditor = false;
}
private void setVe(ViewElement ve, DocumentElement de) {
if (ve.getFromElementId() != null && !ve.getFromElementId().isEmpty()) {
de.setFrom(Converters.getIdToElementConverter()
.apply(ve.getFromElementId(), Application.getInstance().getProject()));
if (ve.getFromProperty() != null) {
if (ve.getFromProperty() == FromProperty.NAME) {
de.setFromProperty(From.NAME);
}
else if (ve.getFromProperty() == FromProperty.DOCUMENTATION) {
de.setFromProperty(From.DOCUMENTATION);
}
else {
de.setFromProperty(From.DVALUE);
}
}
}
de.setId(ve.getId());
de.setTitle(ve.getTitle());
}
@Override
public DocumentElement caseColSpec(ColSpec object) {
DBColSpec res = new DBColSpec();
res.setColname(object.getColname());
res.setColnum(object.getColnum());
if (object.getColwidth() != null && !object.getColwidth().isEmpty()) {
res.setColwidth(object.getColwidth());
}
setVe(object, res);
return res;
}
@Override
public DocumentElement caseImage(Image object) {
DBImage res = new DBImage();
if (object.getCaption() != null && !object.getCaption().isEmpty()) {
res.setCaption(object.getCaption());
}
res.setDoNotShow(object.isDoNotShow());
res.setGennew(object.isGennew());
BaseElement i = Converters.getIdToElementConverter()
.apply(object.getDiagramId(), Application.getInstance().getProject());
if (i instanceof Diagram) {
res.setImage((Diagram) i);
}
setVe(object, res);
return res;
}
@Override
public DocumentElement caseList(List object) {
DBList res = new DBList();
for (ViewElement ve : object.getChildren()) {
res.addElement(this.doSwitch(ve));
}
setVe(object, res);
return res;
}
@Override
public DocumentElement caseListItem(ListItem object) {
DBListItem res = new DBListItem();
for (ViewElement ve : object.getChildren()) {
res.addElement(this.doSwitch(ve));
}
setVe(object, res);
return res;
}
@Override
public DocumentElement caseParagraph(Paragraph object) {
DBParagraph res = new DBParagraph();
res.setText(object.getText());
setVe(object, res);
return res;
}
@Override
public DocumentElement caseTable(Table object) {
DBTable res = new DBTable();
java.util.List<java.util.List<DocumentElement>> headers = new java.util.ArrayList<java.util.List<DocumentElement>>();
java.util.List<java.util.List<DocumentElement>> body = new java.util.ArrayList<java.util.List<DocumentElement>>();
if (object.getBody() != null) {
for (TableRow row : object.getBody()) {
java.util.List<DocumentElement> newrow = new java.util.ArrayList<DocumentElement>();
body.add(newrow);
for (ViewElement ve : row.getChildren()) {
newrow.add(this.doSwitch(ve));
}
}
}
if (object.getHeaders() != null) {
for (TableRow row : object.getHeaders()) {
java.util.List<DocumentElement> newrow = new java.util.ArrayList<DocumentElement>();
headers.add(newrow);
for (ViewElement ve : row.getChildren()) {
newrow.add(this.doSwitch(ve));
}
}
}
res.setBody(body);
res.setHeaders(headers);
res.setCaption(object.getCaption());
if (object.getCols() == 0) {
int max = 0;
for (java.util.List<DocumentElement> row : body) {
if (row.size() > max) {
max = row.size();
}
}
res.setCols(max);
}
else {
res.setCols(object.getCols());
}
if (object.getColspecs() != null) {
java.util.List<DBColSpec> colspecs = new java.util.ArrayList<DBColSpec>();
for (ColSpec cs : object.getColspecs()) {
colspecs.add((DBColSpec) this.doSwitch(cs));
}
res.setColspecs(colspecs);
}
setVe(object, res);
return res;
}
@Override
public DocumentElement caseTableEntry(TableEntry object) {
DBTableEntry res = new DBTableEntry();
if (object.getMorerows() != 0) {
res.setMorerows(object.getMorerows());
}
if (object.getNameend() != null && !object.getNameend().isEmpty()) {
res.setNameend(object.getNameend());
}
if (object.getNamest() != null && !object.getNamest().isEmpty()) {
res.setNamest(object.getNamest());
}
for (ViewElement ve : object.getChildren()) {
res.addElement(this.doSwitch(ve));
}
setVe(object, res);
return res;
}
@Override
public DocumentElement caseText(Text object) {
DBText res = new DBText();
res.setText(object.getText());
setVe(object, res);
return res;
}
@Override
public DocumentElement caseMDEditableTable(MDEditableTable object) {
DBTable table = null;
EditableTable et = convertEditableTable(object);
DBTable ettable = null;
boolean addline = object.isAddLineNum();
if (object.getMergeCols() != null && !object.getMergeCols().isEmpty() && !forViewEditor) {
ettable = Utils.getDBTableFromEditableTable(et, addline,
object.getMergeCols().toArray((new Integer[1])));
}
else {
ettable = Utils.getDBTableFromEditableTable(et, addline);
}
table = (DBTable) this.caseTable(object);
if (object.getBody() != null && !object.getBody().isEmpty()) {
ettable.setBody(table.getBody());
ettable.setCols(table.getCols());
}
if (object.getHeaders() != null && !object.getHeaders().isEmpty()) {
ettable.setHeaders(table.getHeaders());
}
ettable.setCaption(table.getCaption());
ettable.setColspecs(table.getColspecs());
ettable.setTitle(table.getTitle());
ettable.setStyle(table.getStyle());
ettable.setId(table.getId());
return ettable;
}
public static EditableTable convertEditableTable(MDEditableTable object) {
java.util.List<java.util.List<Object>> body = new ArrayList<java.util.List<Object>>();
java.util.List<java.util.List<PropertyEnum>> e = new ArrayList<java.util.List<PropertyEnum>>();
for (TableRow tr : object.getGuiBody()) {
java.util.List<Object> row = new ArrayList<Object>();
java.util.List<PropertyEnum> rowe = new ArrayList<PropertyEnum>();
for (ViewElement ve : tr.getChildren()) {
if (ve.getFromElementId() != null && !ve.getFromElementId().isEmpty()) {
Element element = Converters.getIdToElementConverter()
.apply(ve.getFromElementId(), Application.getInstance().getProject());
row.add(element);
if (ve.getFromProperty() == FromProperty.DOCUMENTATION) {
rowe.add(PropertyEnum.DOC);
}
else if (ve.getFromProperty() == FromProperty.NAME) {
rowe.add(PropertyEnum.NAME);
}
else {
rowe.add(PropertyEnum.VALUE);
}
}
else {
if (ve instanceof Paragraph) {
row.add(((Paragraph) ve).getText());
}
else if (ve instanceof Text) {
row.add(((Text) ve).getText());
}
else {
row.add("cannot be rendered");
}
rowe.add(PropertyEnum.NAME);
}
}
body.add(row);
e.add(rowe);
}
EditableTable et = new EditableTable(object.getTitle(), body, object.getGuiHeaders(), null, e,
object.getPrecision());
et.setEditableCol(object.getEditable());
et.prepareTable();
return et;
}
}